<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Object对象</title>
	</head>
	<body>
		<script type="text/javascript">
			/* Object对象 */
				/* 属性
					constructor : 对一个Javascript函数的引用,该函数是对象的构造函数。
					prototype : */
					
				/* 方法
					静态方法 //无实例化eg: Object.assign(target,...sources)
					assign(target,...sources) 	把一个或多个源对象的可枚举、自有属性值复制到目标对象中，返回值为目标对象。
					propertyIsEnumerable()	检查指定的属性是否存在,以及是否能用for/in循环枚举。
					
					实例方法
					toString()	返回对象的字符串表示。
					valueOf()	返回对象的原始值(如果存在)。
								JavaScript的许多内置对象都重写了该函数，以实现更适合自身的功能需要。
								因此，不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。
					toLocaleString() 返回当前对象的"本地化"字符串形式，以便于当前环境的用户识别和使用
					
					hasOwnProperty()	检查对象是否有局部定义的(非继承的)、具有特定名字的属性。
					isPrototypeOf()	检查对象是否是指定对象的原型。
					
					freeze() 	可以冻结一个对象，冻结指的是不能向这个对象添加新的属性，不能修改其已有属性的值，不能删除已有属性，
								以及不能修改该对象已有属性的可枚举性、可配置性、可写性。也就是说，这个对象永远是不可变的。
								该方法返回被冻结的对象。*/
					
					
				/* isPrototypeOf() */
					//isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中，是则返回true，否则返回false。
					var People = function(name,age){
						this.name = name;
						this.age = age;
					};
					People.prototype = {
						constructor: People,
						sayName: function(){
							console.log("My name is "+this.name);
						},
					};
					var people1 = new People("Lin1",23);
					var people2 = new People("Lin2",23);
					
					var result = people1.isPrototypeOf(people2);
					document.write(result + "</br>");//结果为 false 
					result = people1.isPrototypeOf(People);
					document.write(result + "</br>");//结果为 false 
					result = People.isPrototypeOf(people1);
					document.write(result + "</br>");//结果为 false 
					result = People.prototype.isPrototypeOf(people1);
					document.write(result + "</br>");//结果为 true 
					// result = people2.prototype.isPrototypeOf(people1);
						//此代码是错误的,实例化的对象不存在isPrototypeOf属性
						//该属性仅属于对象原型
					document.write("</br>");
					
				/* hasOwnProperty() */
					//hasOwnProperty判断一个对象是否有该名称的属性或对象，此方法无法检查该对象的原型链中是否具有该属性，该属性必须是对象本身的一个成员。 
					//如果该属性或者方法是该 对象自身定义的而不是器原型链中定义的 则返回true;否则返回false; 
					result = People.hasOwnProperty("name");
					document.write(result + "</br>");//结果为 true 
					result = People.prototype.hasOwnProperty("name");
					document.write(result + "</br>");//结果为 false
					result = People.prototype.hasOwnProperty("sayName");//
					document.write(result + "</br>");//结果为 true
					/* hasOwnProperty()对对象原型的属性进行判断时，应用Object.hasOwnProperty()
					 hasOwnProperty()*/
					
					result = people1.hasOwnProperty("name");
					document.write(result + "</br>");//结果为 true
					result = people1.hasOwnProperty("sayName");
					document.write(result + "</br>");//结果为 false
					document.write("</br>");
					
				/* toLocaleString() */
					result = ("12345667").toLocaleString();
					document.write(result + "</br>");//结果为 12345667
					result = (12345667).toLocaleString();
					document.write(result + "</br>");//结果为 12,345,667
					result = (new Date()).toLocaleString();
					document.write(result + "</br>");//结果为 2018/11/8 上午11:19:47
					result = (new Date()).toString();
					document.write(result + "</br>");//结果为 Thu Nov 08 2018 11:19:47 GMT+0800(中国标准时间)
					document.write("</br>");
					
				/* valueOf() */
					result = people1.valueOf();
					document.write(result + "</br>");//结果为 [object Object]
					console.log(result);
					document.write("</br>");
					
				/* assign(target,...sources) */
				
				
				/* freeze() */
					var obj = {
						name:"lin",
						age:12,
						say:"Hellow world！",
					};
					var reobj = Object.freeze(obj);//会反回被冻结的对象
					obj.name = "Yang";
					obj.age = 23;
					console.log(reobj);
					console.log(obj.name+"的年龄是："+obj.age);
					// => lin的年龄是: 12
					//如果不执行 Object.freeze(obj) 其结果为 => Yang的年龄是: 23
					//由此可见 obj 对象被冻结
		</script>
	</body>
</html>
